/*
 * @Descripttion: 
 * @version: 
 * @Author: lily
 * @Date: 2021-03-21 14:36:40
 * @LastEditors: lily
 * @LastEditTime: 2021-04-08 15:47:29
 */
/*
 * @lc app=leetcode.cn id=645 lang=javascript
 *
 * [645] 错误的集合
 */

// @lc code=start
/**
 * @param {number[]} nums
 * @return {number[]}
 */

//  思路：
//  使用 map 存储 nums 中每个数字的出现次数。
//  再检查 1 到 n 的每个数字在 map 中出现次数。
//  如果一个数字在 map 中没有出现，它就是缺失数字。
//  如果一个数字的出现了两次，它就是重复数字。

//  复杂度：O(n)  O(n)

var findErrorNums = function (nums) {
    let obj = {}

    // 遍历数组,形成哈希表
    for (let item of nums) {
        if (!obj[item]) {
            obj[item] = 1
        } else {
            obj[item] += 1
        }
    }
    // 找出重复值和丢失值
    for (let i = 1; i < nums.length + 1; i++) {
        if (obj[i] === 2) {
            var re = i
        }
        if (!obj[i]) {
            var lost = i
        }
    }
    return [re, lost]

}
// @lc code=end

findErrorNums([1, 2, 2, 4])